package com.cneport.das.server.param.dispatch;

import com.cneport.das.common.utils.HttpUtils;
import com.cneport.das.server.conf.ConfigCaches;
import com.cneport.das.server.param.conf.Permit;
import com.cneport.das.server.param.conf.ServiceUrl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Desc 参数服务实现
 * @Ver 1.0
 * @Author GavinZhang
 * @Company 东方物通科技有限（北京）公司
 * @Date 2021-12-13 15:33:05
 */
@Service
@Slf4j
public class ParamService {
    @Autowired
    private ConfigCaches configCaches;

    /**
     * 获取参数
     *
     * @param qrType 查询类型
     * @param corpNo 公司实体编号
     * @param qrCode 参数编码
     * @return 成功放回参数集合，不成功返回错误码(-2:服务暂时不支持,-3:转调异常,-4:参数类型未配置，-5:授权未初始化成功，-6：转调地址未被初始化成功，-9：未被授权访问)
     */
    public String getParam(String qrType, String corpNo, String qrCode) {
        Integer mode = configCaches.getMode();
        Integer access = configCaches.getAccess();
        Integer same = configCaches.getSame();
        int pass = 0;
        //本地维护模式
        if (mode == 1) {
            log.error("本地维护模式尚未开通！");
            return "-2";
        } else {
            //转调模式
            //需要做授权控制
            if (access == 1) {
                Map<String, Permit> permits = configCaches.getPermits();
                if (permits == null) {
                    log.error("授权配置文件未被初始化成功！");
                    return "-5";
                }
                Permit permit = permits.get(corpNo);
                if (permit != null) {
                    String allowType = permit.getAllowType();
                    String deny = permit.getDenyType();
                    //通过allowType定义，或通过denyType定义。
                    if ("*".equals(allowType) || allowType.indexOf(qrType) != -1 || (!"".equals(deny) && deny.indexOf(qrType) == -1)) {
                        pass = 1;
                    }

                }
                if (pass == 0) {
                    log.error(corpNo + "客户主体未被授权调用参数类型：" + qrType);
                    return "-9";
                } else {
                    return query(same, qrType, qrCode);
                }
            } else {
                //不做权限控制
                return query(same, qrType, qrCode);
            }
        }
    }

    /**
     * 获取参数
     *
     * @param same
     * @param qrType
     * @param qrCode
     * @return
     */
    private String query(Integer same, String qrType, String qrCode) {
        ServiceUrl su = configCaches.getSRV_URL_XML();
        List<ServiceUrl.DispatchURL> urls = su.getUrls();
        if (urls == null) {
            log.error("转调地址信息未被初始化成功！");
            return "-6";
        }
        String url = "";
        //获取转调地址
        if (same == 1) {
            //使用不同的地址
            for (ServiceUrl.DispatchURL dispatchURL : urls) {
                if (qrType.equals(dispatchURL.getParamType())) {
                    url = dispatchURL.getUrl();
                    break;
                }
            }
        } else {
            //使用相同地址
            ServiceUrl.DispatchURL dispatchURL = urls.get(0);
            url = dispatchURL.getUrl();
        }
        String result = "";
        try {
            if ("".equals(url)) {
                log.error("参数类型" + qrType + "尚未配置转调地址！");
                return "-4";
            }
            Map<String, String> param = new HashMap<>();
            param.put("qrType", qrType);
            param.put("qrCode", qrCode);
            result = HttpUtils.get(url, param, new HashMap());
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("转调发生了异常！" + e.getLocalizedMessage());
            return "-3";
        }

    }
}
